package asds
{
	import asds.list.LinkedList;

	/**
     * 队列通常以 FIFO（先进先出）的方式排序各个元素。</br>
	 * 不过优先级队列和 LIFO 队列（或堆栈）例外，前者根据提供的比较器或元素的自然顺序对元素进行排序，后者按 LIFO（后进先出）的方式对元素进行排序。
     * 无论使用哪种排序方式，队列的头 都是调用 remove() 或 dequeue() 所移除的元素。在 FIFO 队列中，所有的新元素都插入队列的末尾。其他种类的队列可能使用不同的元素放置规则。  
	 * @author 青竹
	 * @email hui161@gmail.com
	 */
	public class Queue extends AbstractCollection implements IQueue
	{
		private var _linkedList:LinkedList;
		public function Queue(size:int=50)
		{
			_linkedList=new LinkedList(size);
		}
		

		/**
		 * @inheritDoc
		 */	
		public function enqueue(obj:*):Boolean{
			return _linkedList.addAtLast(obj)!=null;
		}
		
		/**
		 * @inheritDoc
		 */
		public function dequeue():*{
			return _linkedList.removeFirst();
		}
		
		/**
		 * @inheritDoc
		 */
		public function peek():*{
			return _linkedList.getFirst();
		}
		
		/**
		 * @inheritDoc
		 */
		override public function add(o:*):Boolean
		{
			return _linkedList.add(o);
		}
		
		/**
		 * @inheritDoc
		 */
		override  public function addAll(c:ICollection):void
		{
			_linkedList.addAll(c);
		}
		
		/**
		 * @inheritDoc
		 */
		override  public function clear():void
		{
			_linkedList.clear();
		}
		
		/**
		 * @inheritDoc
		 */
		override  public function contains(o:Object):Boolean
		{
			return _linkedList.contains(o);
		}
		
		/**
		 * @inheritDoc
		 */
		override  public function containsAll(c:ICollection):Boolean
		{
			return _linkedList.containsAll(c);
		}
		
		/**
		 * @inheritDoc
		 */
		override  public function equals(o:Object):Boolean
		{
			return _linkedList.equals(o);
		}
		
		/**
		 *@inheritDoc  
		 */	
		override  public function isEmpty():Boolean
		{
			return _linkedList.isEmpty();
		}
		
		/**
		 *@inheritDoc 
		 */	
		override  public function iterator():Iterator
		{
			return _linkedList.iterator();
		}
		
		/**
		 *@inheritDoc 
		 */	
		override  public function remove(o:Object):Object
		{
			return _linkedList.remove(o);
		}
		
		/**
		 *@inheritDoc 
		 */	
		override  public function removeAll(c:ICollection):Boolean
		{
			return _linkedList.removeAll(c);
		}
		
		/**
		 *@inheritDoc 
		 */	
		override  public function retainAll(c:ICollection):Boolean
		{
			return _linkedList.retainAll(c);
		}
		/**
		 *@inheritDoc 
		 */	
		override  public function size():uint
		{
			return _linkedList.size();
		}
		
		/**
		 *@inheritDoc  
		 */	
		override  public function toArray():Array
		{
			return _linkedList.toArray();
		}
		
	}
}